﻿using System.Collections.Generic;
using Newtonsoft.Json;

namespace XUCore.WeChat.Enterprise.Apis.Group.Message
{
    /// <summary>
    /// 创建企业群发<para/>
    /// 
    /// 1、对于客户群发，sender，external_userid，tag_filter不可同时为空，如果指定了external_userid,则tag_filter不生效<para/>
    /// 2、text和attachments不能同时为空<para/>
    /// 3、attachments中每个附件信息必须与msgtype一致，例如，msgtype指定为image，则需要填写image.pic_url或者image.media_id，否则会报错。<para/>
    /// 4、media_id和pic_url只需填写一个，两者同时填写时使用media_id，二者不可同时为空
    /// </summary>
    public class AddTemplateInput
    {
        /// <summary>
        /// 群发任务的类型，默认为single，表示发送给客户，group表示发送给客户群，必填（否）
        /// </summary>
        [JsonProperty("chat_type")]
        public string chat_type { get; set; }
        /// <summary>
        /// 客户的externaluserid列表，仅在chat_type为single时有效，最多可一次指定1万个客户，必填（否）
        /// </summary>
        [JsonProperty("external_userid")]
        public List<string> external_userid { get; set; }
        /// <summary>
        /// 客户群id列表，仅在chat_type为group时有效，最多可一次指定2000个客户群。指定群id之后，收到任务的群主无须再选择客户群，仅对4.1.10及以上版本的企业微信终端生效，必填（否）
        /// </summary>
        [JsonProperty("chat_id_list")]
        public List<string> chat_id_list { get; set; }
        /// <summary>
        /// 要进行群发的客户标签列表，必填（否）
        /// </summary>
        [JsonProperty("tag_filter")]
        public TagFilter tag_filter { get; set; }
        /// <summary>
        /// 发送企业群发消息的成员userid，当类型为发送给客户群时必填，必填（否）
        /// </summary>
        [JsonProperty("sender")]
        public string sender { get; set; }
        /// <summary>
        /// 是否允许成员在待发送客户列表中重新进行选择，默认为false，仅支持客户群发场景，必填（否）
        /// </summary>
        [JsonProperty("allow_select")]
        public bool allow_select { get; set; }
        /// <summary>
        /// 消息文本内容，最多4000个字节，必填（否）
        /// </summary>
        [JsonProperty("text")]
        public Text text { get; set; }
        /// <summary>
        /// 附件，最多支持添加9个附件，必填（否）
        /// </summary>
        [JsonProperty("attachments")]
        public List<object> attachments { get; set; }
    }

    public class GroupTag
    {
        /// <summary>
        /// 要进行群发的客户标签列表，同组标签之间按或关系进行筛选，不同组标签按且关系筛选，每组最多指定100个标签，支持规则组标签
        /// </summary>
        [JsonProperty("tag_list")]
        public List<string> tag_list { get; set; }
    }

    public class TagFilter
    {
        /// <summary>
        /// 要进行群发的客户标签列表，同组标签之间按或关系进行筛选，不同组标签按且关系筛选，每组最多指定100个标签，支持规则组标签
        /// </summary>
        [JsonProperty("group_list")]
        public List<GroupTag> group_list { get; set; }
    }

    public class Text
    {
        /// <summary>
        /// 消息文本内容，最多4000个字节
        /// </summary>
        [JsonProperty("content")]
        public string content { get; set; }
    }

    public class AttachmentBase
    {
        /// <summary>
        /// 附件类型，可选image、link、miniprogram、video或者file，必填
        /// </summary>
        [JsonProperty("msgtype")]
        public string msgtype { get; set; }
    }

    /// <summary>
    /// 图片附件
    /// </summary>
    public class AttachmentImage : AttachmentBase
    {
        public AttachmentImage()
        {
            msgtype = "image";
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonProperty("image")]
        public ImageItem image { get; set; }
    }

    /// <summary>
    /// Link附件
    /// </summary>
    public class AttachmentLink : AttachmentBase
    {
        public AttachmentLink()
        {
            msgtype = "link";
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonProperty("link")]
        public LinkItem link { get; set; }
    }

    /// <summary>
    /// 小程序附件
    /// </summary>
    public class AttachmentMiniprogram : AttachmentBase
    {
        public AttachmentMiniprogram()
        {
            msgtype = "miniprogram";
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonProperty("miniprogram")]
        public MiniprogramItem miniprogram { get; set; }
    }

    /// <summary>
    /// 视频附件
    /// </summary>
    public class AttachmentVideo : AttachmentBase
    {
        public AttachmentVideo()
        {
            msgtype = "video";
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonProperty("video")]
        public VideoItem video { get; set; }
    }

    /// <summary>
    /// 文件附件
    /// </summary>
    public class AttachmentFile : AttachmentBase
    {
        public AttachmentFile()
        {
            msgtype = "file";
        }

        /// <summary>
        /// 
        /// </summary>
        [JsonProperty("file")]
        public FileItem file { get; set; }
    }
}